import * as d3 from 'd3';
import {geoAitoff, geoBromley} from "d3-geo-projection";
import {ProjectionEarth, ProjectionSky} from "@/utils/projection/projection";

export class SphereEarth extends ProjectionEarth {

    _setProjection() {
        this.projection = d3.geoOrthographic();
    }

    _setDefaultOpt() {
        super._setDefaultOpt();
        // =================================================================
        this.defaultOpt.sun = true;
        this.defaultOpt.moon = true;
        // =================================================================
        this.defaultOpt.custLevels = 3;
        // =================================================================
        this.defaultOpt.projBgLevel = 1;
        this.defaultOpt.projBmLevel = 1;
        this.defaultOpt.projGridLineLevel = 2;
        this.defaultOpt.projGridTextLevel = 2;
        // =================================================================
        this.defaultOpt.sunLevel = 3;
        this.defaultOpt.moonLevel = 4;
        // =================================================================
        this.options.attitude = [0, 0, 0];
        this.defaultOpt.scaleRatio = Math.PI * 0.75;
        // =================================================================
        this.defaultOpt.switch_to_pos = 3;
        this.defaultOpt.sun_zone_radius = 90;
        // =================================================================
        this.defaultOpt.rotation = true;
        this.defaultOpt.rotationRatio = 360 / (24 * 60 * 60 * 1000);
        // =================================================================
        this.defaultOpt.zoom = true;
        this.defaultOpt.zoomScale = [0.5, 10];
        // =================================================================
        this.defaultOpt.drag = true;
    }

}

export class PlaneEarth extends SphereEarth {

    _setProjection() {
        this.projection = d3.geoNaturalEarth1();
    }

    _setDefaultOpt() {
        super._setDefaultOpt();
        this.defaultOpt.scaleRatio = Math.PI * 1.11;
    }

}


export class SphereSky extends ProjectionSky {

    _setProjection() {
        this.projection = d3.geoOrthographic();
    }

    _setDefaultOpt() {
        super._setDefaultOpt();
        // =================================================================
        this.defaultOpt.galaxy = true;
        this.defaultOpt.ecliptic = true;
        // =================================================================
        this.defaultOpt.sun = true;
        this.defaultOpt.moon = true;
        // =================================================================
        this.defaultOpt.custLevels = 3;
        // =================================================================
        this.defaultOpt.projBgLevel = 1;
        this.defaultOpt.projGridLineLevel = 2;
        this.defaultOpt.projGridTextLevel = 2;
        // =================================================================
        this.defaultOpt.galaxyLevel = 3;
        this.defaultOpt.eclipticLevel = 4;
        // =================================================================
        this.defaultOpt.sunLevel = 5;
        this.defaultOpt.moonLevel = 6;
        // ===================================================
        this.defaultOpt.scaleRatio = Math.PI * 0.75;
        // ===================================================
        this.defaultOpt.projGridTextColor = '#d5d2d2';
        // ===================================================
        this.defaultOpt.in_out = 1; // 1 from outside; -1 from inside
        this.options.attitude = [0, 0, 0];
        // ===================================================
        this.defaultOpt.sun = true;
        this.defaultOpt.moon = true;
        this.defaultOpt.galaxy = true;
        this.defaultOpt.ecliptic = true;
        // ===================================================
        this.defaultOpt.switch_to_pos = 3;
        this.defaultOpt.sun_zone_radius = 45;
        // ===================================================
        this.defaultOpt.rotation = true;
        this.defaultOpt.rotationRatio = 360 / (24 * 60 * 60 * 1000);
        // ===================================================
        this.defaultOpt.zoom = true;
        this.defaultOpt.zoomScale = [0.5, 10];
        // =================================================================
        this.defaultOpt.drag = true;
    }

}


export class PlaneSky extends SphereSky {

    _setProjection() {
        this.projection = geoAitoff(); // geoBromley() geoAitoff()
    }

    _setDefaultOpt() {
        super._setDefaultOpt();
        this.defaultOpt.scaleRatio = Math.PI * 1.11;
    }

}



